// EvaluatingPlayer.h : interface of the CEvaluatingPlayer class

// Deklaracia zoznamu, do ktoreho sa budu ukladat hraci ziskani z vizualnej informacie hraca

#ifndef EVALUATING_PLAYER_H
#define EVALUATING_PLAYER_H

#include "EvaluatingPane.h"

#include "Common/World/Vector.h"
#include <vector>

using namespace std;

// Definuje vyctovy typ hraca
enum PlayerType
{
	PT_OUR = 1, PT_THEIR, PT_NEARBY, PT_UNKNOWN
};	

struct PaneList
{
	CEvaluatingPane* ePane;
	double lfContribution;
};

class CEvaluatingPlayer
{
	// Do ktoreho timu patri tento hrac?
	PlayerType enumPlayerType;
	
	// Identifikacne cislo hraca
	int nIDnumber;

	// X a Y pozicia hraca na ihrisku v momente vytvorenia instancie hraca
	double lfXPosition; double lfYPosition;

	// Miera vplyvu daneho hraca na policko, na ktorom posobi (resp. je umiestneny)
	int nInflPower; 

	// Maximalna vzdialenost posobenia vplyvu daneho hraca v [metroch]
	int nInflSize;

	// Aka stara je tato informacia o hracovi?
	int nPlayerInformationAge;
	
	// O aky uhol je hrac natoceny vzhladom na kladnu os x?
	double lfTurnAngle;

	// Aku rychlost dosahuje prave hrac?
	Vector vectSpeed;

	// Na ktore policka ma tento hrac vplyv?
	vector<PaneList*> influencePaneList;

public:
	// Konstruktor
	CEvaluatingPlayer(PlayerType ePType, int nID, double lfXPos, double lfYPos, int nIPower, int nISize, double lfTAngle, Vector Speed)
	{
		enumPlayerType = ePType;
		nIDnumber = nID;
		lfXPosition = lfXPos; lfYPosition = lfYPos;
		nPlayerInformationAge = 0;
		nInflPower = nIPower;
		nInflSize = nISize;
		lfTurnAngle = lfTAngle;
		vectSpeed = Speed;
	}
	
	// Destruktor
	~CEvaluatingPlayer();

	// Iterator policok s vplyvom tohto hraca -> pouziva sa pre pristup do pola policok s vplyvom
	vector<PaneList*>::iterator influencePaneListIterator;
	
	vector<PaneList*>::iterator GetInflPaneListIteratorBegin()	{ return influencePaneList.begin(); }
	vector<PaneList*>::iterator GetInflPaneListIteratorEnd()	{ return influencePaneList.end();	 }


	// Nove policko sa vytvori, naplni sa a vlozi do zoznamu
	void InsertPaneToPaneList(CEvaluatingPane* ePane, double lfContribution);

	// Vypocita svoj prispevok na policko nachadzajuce sa nRadius policok od hraca
	double CalculatePlayerContribution(CEvaluatingPane* ePane, int nRadius);

	// Spocita prispevky vsetkych policok pod vplyvom hraca
	double CalculateMaxEvaluation();

	// Vrati identifikacne cislo hraca
	int GetPlayerIDNumber()
	{
		return nIDnumber;
	}

	// Nastavi identifikacne cislo hraca
	void SetPlayerIDNumber(int nID)
	{
		nIDnumber = nID;
	}

	// Vrati mieru vplyvu hraca na z centralneho policka
	int GetPlayerInfluencePower()
	{
		return nInflPower;
	}

	// Nastavi mieru vplyvu hraca na centralnom policku
	void SetPlayerInfluencePower(int nPIPower)
	{
		nInflPower = nPIPower;
	}
	
	// Vrati maximalnu vzdialenost posobenia vplyvu daneho hraca v [metroch]
	int GetPlayerInfluenceSize()
	{
		return nInflSize;
	}

	// Nastavi maximalnu vzdialenost posobenia vplyvu daneho hraca v [metroch]
	void SetPlayerInfluenceSize(int nPISize)
	{
		nInflSize = nPISize;
	}

	// Vrati uhol natocenia hraca vzhladom na kladnu os x
	double GetPlayerTurnAngle()
	{
		return lfTurnAngle;
	}

	// Nastavi uhol natocenia hraca vzhladom na kladnu os x
	void SetPlayerTurnAngle(double lfPTAngle)
	{
		lfTurnAngle = lfPTAngle;
	}

	// Vrati aktualnu rychlost hraca
	Vector GetPlayerSpeed()
	{
		return vectSpeed;
	}

	// Nastavi aktualny rychlost hraca
	void SetPlayerSpeed(Vector Speed)
	{
		vectSpeed = Speed;
	}

	// Vrati - aka stara je informacia o tomto hracovi v cykloch?
	int GetPlayerInformationAge()
	{
		return nPlayerInformationAge;
	}

	// Nastavi vek informacie o tomto hracovi na vstupnu hodnotu
	void SetPlayerInformationAge(int nPIAge)
	{
		nPlayerInformationAge = nPIAge;
	}

	// Vrati informaciu o type, do ktoreho tento hrac patri
	PlayerType GetPlayerType()
	{
		return enumPlayerType;
	}
	
	// Nastavi informaciu o type hraca
	void SetPlayerType(PlayerType PT)
	{
		enumPlayerType = PT;
	}

	// Vrati X poziciu hraca na ihrisku
	double GetPlayerXPosition()
	{
		return lfXPosition;
	}

	// Nastavi X poziciu hraca na ihrisku
	void SetPlayerXPosition(double tmpXPos)
	{
		lfXPosition = tmpXPos;
	}

	// Vrati Y poziciu hraca na ihrisku
	double GetPlayerYPosition()
	{
		return lfYPosition;
	}

	// Nastavi Y poziciu hraca na ihrisku
	void SetPlayerYPosition(double tmpYPos)
	{
		lfYPosition = tmpYPos;
	}

	// Odstrani prispevky tohto hraca zo vsetkych policok
	void RemoveAllContributionsFromPanes();
};











#endif // EVALUATING_PLAYER_H
